package com.lxm.ymcc.service.impl;

import com.lxm.ymcc.constents.RedisConstents;
import com.lxm.ymcc.domain.CourseType;
import com.lxm.ymcc.mapper.CourseTypeMapper;
import com.lxm.ymcc.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author whale
 * @since 2022-10-23
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
//      @Autowired
//      private RedisTemplate<Object,Object> RedisTemplate;

    @Override
   @Cacheable(cacheNames = RedisConstents.TAYE_IN_REDIS_KEY, key = "'all'")
    public List<CourseType> treeData() {
//        List<CourseType> courseTypes =null;
//        // 使用redis做缓存
//        Object o = RedisTemplate.opsForValue().get(RedisConstents.TAYE_IN_REDIS_KEY);
//        if (o!=null){
//            courseTypes = (List<CourseType>) o;
//
//        }else {
//            // redis中没有缓存 从数据库中找
//            courseTypes = chenkDed();
//            // 添加到redis的缓存中
//            RedisTemplate.opsForValue().set(RedisConstents.TAYE_IN_REDIS_KEY,courseTypes);
//        }

        return chenkDed();
    }

    public List<CourseType> chenkDed() {
        // 1.查询所有的数据
        List<CourseType> courseTypes = selectList(null);
        // 2.把数据转化为map
        Map<Long, CourseType> collect = courseTypes.stream().collect(Collectors.toMap(CourseType::getId, courseType -> courseType));

        // 3. 创建一个list用来接受数据
        ArrayList<CourseType> list = new ArrayList<>();
        courseTypes.forEach(courseType -> {
            if (courseType.getPid()==null||courseType.getPid()==0){
                // 顶级父类
                list.add(courseType);
            }else {
                // 找到自己的父类
                CourseType parent = collect.get(courseType.getPid());
                if (parent!=null)parent.getChildren().add(courseType);
            }
        });
        return list;
    }

    @Override
    @CacheEvict(cacheNames = RedisConstents.TAYE_IN_REDIS_KEY, key =  "'all'")
    public boolean insert(CourseType entity) {
//        boolean b = super.insert(entity); // 添加成功以后在删除
//        if (b){
//            RedisTemplate.delete(RedisConstents.TAYE_IN_REDIS_KEY);
//        }
       return super.insert(entity);
    }

    @Override
    @CacheEvict(cacheNames = RedisConstents.TAYE_IN_REDIS_KEY, key =  "'all'")
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }

    @Override
    @CacheEvict(cacheNames = RedisConstents.TAYE_IN_REDIS_KEY, key =  "'all'")
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }
}
